package com.hanvon.faceRec;

/**
 * @author hw
 *         1. 2012.7.4
 *         添加注释
 *         修改附加模板函数：AddAditionTemplate 函数名为：AddPlusTemplate
 *         2. 2012.8.03
 *         添加函数：
 *         GetFaceFeatureEx
 *         CompareFeature
 *         CompareSecondFeature
 *         GetFeatureSize
 *         AddUserWithFeatures
 */
public class FaceCoreHelper {
    public static final String SERIAL_NUMBER = "ZZSJZJJTKJGFYXGS-2015-07";
    public static final int HW_OK = 0;

    static {
        System.loadLibrary("HWFaceLibSDK");
    }

    /**
     * so 初始化函数
     *
     * @param pbSrcData 库外部内存区
     * @param iDataSize 库外部内存区大小
     * @return
     */
    public static native int InitFaceEngine(byte[] pbSrcData, int iDataSize, String strSerialNumber);

    /**
     * so 注销函数
     *
     * @return
     */
    public static native int ReleaseFaceEngine();

    /**
     * so 人脸检测函数
     *
     * @param pbImg           灰度图
     * @param nWidth          图像宽度
     * @param nHeight         图像高度
     * @param pFacePos        人脸位置缓存区
     * @param nMaxFaceNum     最大人脸数
     * @param pnDetectFaceNum 实际检测到人脸数
     * @return
     */
    public static native int FaceDetection(byte[] pbImg, int nWidth, int nHeight, int[] pFacePos, int nMaxFaceNum, int[] pnDetectFaceNum);

    /**
     * so
     *
     * @param pFacePos       人脸检测返回的人脸信息
     * @param nWidth         图像宽度
     * @param nHeight        图像高度
     * @param nDetectFaceNum 检测人数数
     * @param pOutputParams  计算得到返回值
     * @return
     */
    public static native int GetFaceOutputParams(int[] pFacePos, int nWidth, int nHeight, int nDetectFaceNum, int[] pOutputParams);

    /**
     * so 设置检测规则
     *
     * @param nDisRule 距离参数
     * @param nStrRule 严格程度
     * @return
     */
    public static native int SetFaceDetectionRule(int nDisRule, int nStrRule);

    /**
     * so 获取检测规则
     *
     * @param pnDisRule 距离参数
     * @param pnStrRule 严格程度
     * @return
     */
    public static native int GetCurrentFaceDetectionRule(int[] pnDisRule, int[] pnStrRule);

    /**
     * so 获取光线检测
     *
     * @param pbImg        灰度图
     * @param nWidth       图像宽度
     * @param nHeight      图像高度
     * @param pFacePos     人脸位置缓存区
     * @param nFaceNum     实际检测到人脸数
     * @param pnSuggestion 检测结果
     * @return
     */
    public static native int EnviromentVerfication(byte[] pbImg, int nWidth, int nHeight, int[] pFacePos, int nFaceNum, int[] pnSuggestion);

    /**
     * so 添加用户
     *
     * @param pbImageArray 图片序列
     * @param iDetected    是否需要内部进行检测
     * @param nImgNum      图片序列数
     * @param nWidth       图片宽度
     * @param nHeight      图片高度
     * @param pFacePos     人脸位置缓冲区
     * @param strName      姓名
     * @param nTempletNum  设定模板数
     * @param pnID         用户ID，若添加成功则返回ID，否则返回-1
     * @param pbDstData    库外部内存区
     * @param pnDataSize   库外部内存区大小,本函数会改变库外部内存区内容
     * @return
     */
    public static native int AddNewUser(byte[] pbImageArray, int iDetected, int nImgNum, int nWidth, int nHeight, int[] pFacePos, String strName, int nTempletNum, int[] pnID,
                                        byte[] pbDstData, int[] pnDataSize);

    /**
     * so 附加模板
     *
     * @param pbImageArray 灰度图片
     * @param nWidth       图片宽度
     * @param nHeight      图片高度
     * @param pID          用户ID
     * @param pFacePos     人脸位置缓冲区
     * @param pbDstData    库外部内存区
     * @param pnDataSize   库外部内存区大小,本函数会改变库外部内存区内容
     * @return
     */
    public static native int AddPlusTemplate(int[] pbImageArray, int nWidth, int nHeight, int pID, int[] pFacePos, byte[] pbDstData, int[] pnDataSize);

    /**
     * so 删除指定用户
     *
     * @param nID        删除用户的ID
     * @param pbDstData  库外部内存区
     * @param pnDataSize 库外部内存区大小,本函数会改变库外部内存区内容
     * @return
     */
    public static native int RemoveUserbyID(int nID, byte[] pbDstData, int[] pnDataSize);

    /**
     * so 获取用户数
     *
     * @param pnNum 用户数
     * @return
     */
    public static native int GetUserIDCount(int[] pnNum);

    /**
     * so 获取指定序号用户ID
     *
     * @param nIndex 序号（从1开始）
     * @param pnID   用户ID
     * @return
     */
    public static native int GetUserIDbyIndex(int nIndex, int[] pnID);

    /**
     * so 获取指定用户ID 的序号
     *
     * @param nID    用户ID
     * @param pnIndx 用户序号
     * @return
     */
    public static native int GetIndexbyUserID(int nID, int[] pnIndx);

    /**
     * so 更新指定用户ID 用户信息
     *
     * @param nID          用户ID
     * @param pbImageArray 灰度图序列
     * @param iDetected    是否需要进行人脸检测：0 不需要， 1 需要
     * @param nImgNum      序列个数
     * @param nWidth       图片宽度
     * @param nHeight      图片高度
     * @param pFacePos     人脸位置缓冲区
     * @param strName      用户名
     * @param pbDstData    库外部内存区
     * @param pnDataSize   库外部内存区大小,本函数会改变库外部内存区内容
     * @return
     */
    public static native int UpdateUserInfobyID(int nID, byte[] pbImageArray, int iDetected, int nImgNum, int nWidth, int nHeight, int[] pFacePos, String strName,
                                                byte[] pbDstData, int[] pnDataSize);


    /**
     * so 更新指定用户ID 用户名
     *
     * @param nID        用户ID
     * @param strName    用户名
     * @param pbDstData  库外部内存区
     * @param pnDataSize 库外部内存区大小,本函数会改变库外部内存区内容
     * @return
     */
    public static native int UpdateUserNamebyID(int nID, String strName, byte[] pbDstData, int[] pnDataSize);

    /**
     * so 获取指定用户ID 用户信息
     *
     * @param nID          用户ID
     * @param pbImageArray 截图
     * @param pnImgNum     序列个数
     * @param pnWidth      图片宽度
     * @param pnHeight     图片高度
     * @param pFacePos     人脸区域缓冲区
     * @param pbName       用户名
     * @param pnIndex      序号
     * @return
     */
    public static native int GetUserInfobyID(int nID, byte[] pbImageArray, int[] pnImgNum, int[] pnWidth, int[] pnHeight, int[] pFacePos, byte[] pbName, int[] pnIndex);

    /**
     * so 获取指定序号的 用户信息
     *
     * @param nIndex       用户序号
     * @param pbImageArray 截图
     * @param pnImgNum     序列个数
     * @param pnWidth      图片宽度
     * @param pnHeight     图片高度
     * @param pFacePos     人脸区域缓冲区
     * @param pbName       用户名
     * @param pnID         用户ID
     * @return
     */
    public static native int GetUserInfobyIndex(int nIndex, byte[] pbImageArray, int[] pnImgNum, int[] pnWidth, int[] pnHeight, int[] pFacePos, byte[] pbName, int[] pnID);

    /**
     * so 人脸识别函数
     *
     * @param pbImg    灰度图
     * @param nWidth   图片宽度
     * @param nHeight  图片高度
     * @param pFacePos 人脸区域缓冲区
     * @param pnID     用户ID
     * @param pnScore  人脸比对得分
     * @param pnFtrPos 最匹配模板序号
     * @return
     */
    public static native int FaceRecognition(byte[] pbImg, int nWidth, int nHeight, int[] pFacePos, int[] pnID, int[] pnScore, int[] pnFtrPos, byte[] pbDstData, int[] pnDataSize);

    /**
     * so 判断图片是否适合识别
     *
     * @param pbImg    待检灰度图片
     * @param nWidth   图片宽度
     * @param nHeight  图片高度
     * @param pFacePos 人脸区域缓冲区
     * @param pnReason 检测结果
     * @return
     */
    public static native int FaceVerifationforRecognition(byte[] pbImg, int nWidth, int nHeight, int[] pFacePos, int[] pnReason);

    /**
     * so 判断图片是否适合添加用户
     *
     * @param pbImg    待检灰度图片
     * @param nWidth   图片宽度
     * @param nHeight  图片高度
     * @param pFacePos 人脸区域缓冲区
     * @param pnReason 检测结果
     * @return
     */
    public static native int FaceVerifationforAddNewUser(byte[] pbImg, int nWidth, int nHeight, int[] pFacePos, int[] pnReason);

    /**
     * so 设置识别严格程度
     *
     * @param nRule 严格程度
     * @return
     */
    public static native int SetfaceRecognitionRule(int nRule);

    /**
     * so 获取识别严格程度
     *
     * @param pnRule 严格程度
     * @return
     */
    public static native int GetfaceRecognitionRule(int[] pnRule);

    /**
     * so 裁剪图片，该函数仅针对YUV NV21格式有效
     *
     * @param pbInYUVImgBuf  NV21格式YUV数据
     * @param nIndex         启始位置
     * @param nInImageWidth  图片宽度
     * @param nInImageHeight 图片高度
     * @param nInRectWidth   裁剪宽度
     * @param nInRectHeight  裁剪高度
     * @param nTop           裁剪左上角Y
     * @param nLeft          裁剪左上角X
     * @param pbOutBuff      裁剪图像数据
     * @return
     */
    public static native int CropYUVNV21(byte[] pbInYUVImgBuf, int nIndex, int nInImageWidth, int nInImageHeight, int nInRectWidth, int nInRectHeight, int nTop, int nLeft, byte[] pbOutBuff);

    /**
     * SO 版本
     *
     * @return
     */
    public static native String GetSDKVersion();


    //Add 2012.8.03

    /**
     * so 提取特征模板
     *
     * @param pbImg           图像数据灰度图
     * @param nWidth          图像宽度
     * @param nHeight         图像高度
     * @param pnFrEyePosition 检测到人脸位置
     * @param pbFrFaceFeature 提取的模板数据
     * @return
     */
    public static native int GetFaceFeatureEx(byte[] pbImg, int nWidth, int nHeight, int[] pnFrEyePosition, byte[] pbFrFaceFeature);

    /**
     * so 特征比对
     *
     * @param pbThisFeature      待比对特征
     * @param pbReferenceFeature 已录入模板
     * @param pnFrvalue          比对得分
     * @return
     */
    public static native int CompareFeature(byte[] pbThisFeature, byte[] pbReferenceFeature, int[] pnFrvalue);

    /**
     * so 特征比对第二段
     *
     * @param pbThisFeature      待比对特征
     * @param pbReferenceFeature 已录入模板
     * @param pnFrvalue          比对得分
     * @return
     */
    public static native int CompareSecondFeature(byte[] pbThisFeature, byte[] pbReferenceFeature, int[] pnFrvalue);

    /**
     * so 获取特征大小
     *
     * @param pnFrFaceFeatureLength 返回特征大小
     * @return
     */
    public static native int GetFeatureSize(int[] pnFrFaceFeatureLength);

    /**
     * so 直接用已提取的模板录入用户，本函数区别于AddNewUser函数，上述函数式通过输入一些图片数据，录入。
     *
     * @param pbFeatureArray 带录入特征数据
     * @param strName        姓名
     * @param nTempletNum    模板数
     * @param pnID           返回用户ID
     * @param pbDstData      库外部内存区
     * @param pnDataSize     库外部内存区大小,本函数会改变库外部内存区内容
     * @return
     */
    public static native int AddUserWithFeatures(byte[] pbFeatureArray, String strName, int nTempletNum, int[] pnID, byte[] pbDstData, int[] pnDataSize);

    public static native int JudgeImagePos(byte[] pbImg, int iWidth, int iHeight, int iLeftEyeX, int iLeftEyeY, int iRightEyeX, int iRightEyeY, byte[] pbRam, int iStrictFlag);
}
